/* 
 * File:   Motor.cpp
 * Author: 75.02 - Grupo 7, 2do cuatrimestre 2012.
 * 
 * Created on 31 de octubre de 2012, 18:53
 */

#include "MotorJuego.h"
using namespace TP::Juego::Motorizacion;

MotorJuego::MotorJuego() {}

MotorJuego::~MotorJuego() {
    
    // Libero la coleccion de partidas.
    // this->_partidas.clear();
    
    // Elimino el motor de desplazamiento.
    if (this->_motorDesplazamiento)
        delete this->_motorDesplazamiento;
}

vector<Partida*>& MotorJuego::getPartidas(){
    
    return this->_partidas;
}

Partida* MotorJuego::correrPartida (Partida* pPartida){
    
    if (pPartida)
    {
        /* Declaro la partida en cada uno de los motores que componen el motor
         * de juego.
         */
        //@todo : test...
        
        this->_motorDesplazamiento->correrPartida(pPartida);
        
        //@todo: Se debe definir el motor de colisiones y correr la partida en dicho motor.

        // Declaro la partida en el motor de juego.
        this->_partidas.push_back(pPartida);
    }
}

Ticks MotorJuego::notificacionAvanceTiempo (Ticks pTiempo){}


Partida* MotorJuego::getPartidaPorJugador (Jugador* pJugador){
    
    // Por defecto el jugador no pertenece a partida alguna.
    Partida* partida = NULL;
    
    for (vector<Partida*>::iterator it = this->_partidas.begin(); it != this->_partidas.end() && NULL == partida; ++it)
    {
        Partida* partidaAux = (*it);
        
        for (size_t curJugadores = 0; curJugadores < partidaAux->getJugadores().size(); curJugadores++)
        {
            if (*partidaAux->getJugadores()[curJugadores] == *pJugador)
            {
                partida = partidaAux;
                break;
            }
        }
    }
    return partida;
}

Partida* MotorJuego::getPartidaPorNombre (const string& pNombrePartida){

    // Por defecto la partida no existe.

    Partida* partida = NULL;

    for (vector<Partida*>::iterator it = this->_partidas.begin(); it < this->_partidas.end() && partida == NULL; ++it)
    {
        if ((*it)->getNombre() == pNombrePartida)
            partida = *it;
    }
    
    return partida;
}

vector<string> MotorJuego::listarPartidas(){

    vector<string> lista;
    
    if (!this->getPartidas().empty())
    {
        for (vector<Partida*>::iterator it = this->_partidas.begin(); it != this->_partidas.end(); it++)
            lista.push_back((*it)->getNombre());
    }
    
    return lista;
}